package com.greyshark.lib.bluetooth.utils

import java.math.BigInteger
import java.util.Locale

class ByteHexUtils {

    companion object {
        val instance: ByteHexUtils by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
            ByteHexUtils()
        }
    }

    fun bytesToHexString(data: ByteArray): String {
        val sb = StringBuilder(data.size)
        if (data.isEmpty()) {
            return ""
        }
        for (byteChar in data) {
            sb.append(String.format(Locale.ENGLISH, "%02X ", byteChar))
        }
        return sb.toString()
    }

    fun bytesToHex(bytes: ByteArray, isLittleEndian: Boolean = true): Long {
        if (isLittleEndian){
            var result = 0L
            for (i in bytes.indices) {
                result = result or ((bytes[i].toLong() and 0xFF) shl (i * 8))
            }
            return result
        } else {
            var result = 0L
            for (i in bytes.indices) {
                result = result or ((bytes[i].toLong() and 0xFF) shl ((bytes.size - 1 - i) * 8))
            }
            return result
        }
    }

    fun byteToIntArray(b: Byte): IntArray {
        val result = IntArray(8)
        val binStr = ByteArray(1)
        binStr[0] = b
        val byteStr: String = BigInteger(1, binStr).toString(2)
        for (i in byteStr.length - 1 downTo 0) {
            result[i + 8 - byteStr.length] = byteStr.substring(i, i + 1).toInt()
        }
        return result
    }
}